package manager;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import model.User;
import util.FileUtil;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户管理类，负责用户注册、登录及数据持久化（JSON格式）
 */
public class UserManager {

    private static final String USER_FILE = "data/users.json"; // 用户数据文件路径
    private List<User> userList; // 用户列表
    private Gson gson;

    public UserManager() {
        gson = new Gson();
        loadUsers();
    }

    /**
     * 加载用户数据文件，若文件不存在则新建空列表
     */
    private void loadUsers() {
        String json = FileUtil.readFile(USER_FILE);
        //从用户数据文件（路径为 "data/users.json"）中读取 JSON 格式的字符串。
        //如果该文件不存在或为空，json 就是空字符串。
        if (json.isEmpty()) {
            //如果文件为空，说明是首次运行或还没注册任何用户。
            //使用 new ArrayList<>() 创建一个空的用户列表。
            //然后调用 saveUsers() 把空列表写入文件，避免下次启动时找不到结构。
            userList = new ArrayList<>();
            saveUsers(); // 写入空文件
        } else {
            //TypeToken<List<User>>(){}.getType() 用于告诉 Gson 想要解析的具体类型
            Type type = new TypeToken<List<User>>() {}.getType();
            //使用 Gson 把 JSON 字符串转换（反序列化）为 List<User> 类型。
            userList = gson.fromJson(json, type);
            //解析失败或返回 null（可能是文件损坏），就新建一个空列表。
            if (userList == null) userList = new ArrayList<>();
        }
    }

    /**
     * 保存当前用户列表到文件
     */
    private void saveUsers() {
        String json = gson.toJson(userList);
        FileUtil.writeFile(USER_FILE, json);
    }

    /**
     * 用户注册
     * @param username 用户名
     * @param password 密码
     * @return 注册成功返回true，用户名存在返回false
     */
    public boolean register(String username, String password) {
        //遍历 userList 列表中的每一个 User 对象，并把当前元素赋值给变量 u，供循环体内使用
        for (User u : userList) {
            if (u.getUsername().equals(username)) {
                return false; // 用户名重复
            }
        }
        userList.add(new User(username, password));
        saveUsers();
        return true;
    }

    /**
     * 用户登录验证
     * @param username 用户名
     * @param password 密码
     * @return 验证成功返回true
     */
    public boolean login(String username, String password) {
        for (User u : userList) {
            if (u.getUsername().equals(username) && u.getPassword().equals(password)) {
                return true;
            }
        }
        return false;
    }
}
